package com.bjpowernode.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.IdUtil;
import com.bjpowernode.constant.Constant;
import com.bjpowernode.entity.TTran;
import com.bjpowernode.mapper.TTranMapper;
import com.bjpowernode.query.BaseQuery;
import com.bjpowernode.query.TranQuery;
import com.bjpowernode.service.TranService;
import com.bjpowernode.util.LoginInfoUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * 交易记录服务实现类
 * 提供交易记录的添加和查询功能
 */
@Service
public class TranServiceImpl implements TranService {
    @Resource
    private TTranMapper tTranMapper;

    /**
     * 添加交易记录
     *
     * @param tranQuery 交易信息查询对象，包含交易的基本信息
     * @return 添加成功的记录数
     */
    @Override
    public int addTran(TranQuery tranQuery) {
        // 创建交易实体对象
        TTran tTran = new TTran();
        // 使用BeanUtil工具类复制属性，将tranQuery中的属性值复制到tTran中
        BeanUtil.copyProperties(tranQuery, tTran);

        // 生成雪花算法ID作为交易编号
        long snowflakeNextId = IdUtil.getSnowflakeNextId();
        tTran.setTranNo(String.valueOf(snowflakeNextId));

        // 设置创建时间和创建人ID
        tTran.setCreateTime(new Date());
        tTran.setCreateBy(LoginInfoUtil.getCurrentLoginUser().getId());
        // 调用Mapper层方法插入交易记录，返回影响的行数
        int count = tTranMapper.insertSelective(tTran);
        return count;
    }

    /**
     * 分页查询交易记录
     *
     * @param current 当前页码
     * @return 交易记录分页信息对象
     */
    @Override
    public PageInfo<TTran> getTranByPage(Integer current) {
        // 使用PageHelper进行分页设置，指定当前页和每页显示记录数
        PageHelper.startPage(current, Constant.PAGE_SIZE);
        // 调用Mapper层方法查询交易记录列表
        List<TTran> tTranList = tTranMapper.selectTranByPage(new BaseQuery());
        // 将查询结果封装成分页信息对象并返回
        PageInfo<TTran> pageInfo = new PageInfo<>(tTranList);
        return pageInfo;
    }

    /**
     * 根据ID获取交易详情
     *
     * @param id 交易ID
     * @return 交易详情对象
     */
    @Override
    public TTran getTranById(Integer id) {
        // 调用Mapper层方法，根据ID查询交易详情并返回
        return tTranMapper.selectById(id);
    }
}
